﻿/**
 * 计算sig 上送时候的sig计算
 * @param  {[type]} data [description]
 * @return {[type]}      [description]
 */
function reckonSig(data) {
  var str1 = "",
    str2 = "";
  // console.log('原数据: ', data);
  //json转键值对
  str1 = jsonToKV(data);
  //alert(str1);
  // console.log('键值对排序后: ', str1);
  //字符串转utf-8;
  str1 = encodeURIComponent(str1);
  str1 = str1.replace(/%20/g, "+"); //把空格的转码替换成+号。
  str1 = str1.replace(/\!/g, "%21"); //替换特殊字符。
  str1 = str1.replace(/\~/g, "%7E"); //替换特殊字符。
  str1 = str1.replace(/\'/g, "%27"); //替换特殊字符。
  str1 = str1.replace(/\(/g, "%28"); //替换特殊字符。
  str1 = str1.replace(/\)/g, "%29"); //替换特殊字符。
  console.log('字符串转utf-8: ',str1);
  //sha256加密
  str2 = hex_sha256(str1).toUpperCase();
  console.log('加密后: ', str2);

  return str2;
}


/**
 * 计算sig 接收时候验证的sig计算
 * @param  {[type]} data [description]
 * @return {[type]}      [description]
 default_data,get_data
 */
function reckonSigGet(default_data, _get_data) {

  var str1 = "",
    str2 = "";
  var get_data;

  //判断返回得到的数据是否字符串
  if (typeof(_get_data) == "string") {
    var array1 = [];
    for (var key in default_data) {
      array1.push(key + "=" + default_data[key]);
    };
    array1.sort();
    for (var i = 0; i < array1.length; i++) {
      if (i == array1.length - 1) {
        str1 += array1[i];
      } else {
        str1 += array1[i] + "&";
      }
    }
    str1 = str1.replace(/'|"/ig, '');
    str1 = str1 + "&" + _get_data;
    console.log('排序并转键值对后,get_data == string', str1);
  } else {
    //创建get_data副本.以免影响函数原型.
    get_data = JSON.stringify(_get_data);
    get_data = JSON.parse(get_data);
  }

  //get_data普通数组
  if (get_data instanceof Array) {
    get_data.unshift(default_data);
    var new_data = get_data;
    //排序并转键值对
    str1 = jsonToKV(new_data);
    console.log('排序并转键值对后,get_data == Array', str1);
  }
  
  //get_data为复杂情况(分页) or 基本json
  if (!(get_data instanceof Array) && get_data instanceof Object) {
	  
    //创建新json数据.合并传入的两个json
    var new_data = {};
    for (var key in default_data) {
      new_data[key] = default_data[key];
    }
    for (var key in get_data) {
    	if(get_data[key] != null && get_data[key] != 'null'){
    		new_data[key] = get_data[key];
    	}
    }
    //排序并转键值对
    str1 = jsonToKV(new_data);
    console.log("str1:"+str1);
    console.log('排序并转键值对后,get_data == Object', str1);
  }

  //字符串转utf-8;
  str1 = encodeURIComponent(str1);
  // console.log('转码后: ', str1);
  str1 = str1.replace(/%20/g, "+"); //把空格的转码替换成+号。
  str1 = str1.replace(/\!/g, "%21"); //替换特殊字符。
  str1 = str1.replace(/\~/g, "%7E"); //替换特殊字符。
  str1 = str1.replace(/\'/g, "%27"); //替换特殊字符。
  str1 = str1.replace(/\(/g, "%28"); //替换特殊字符。
  str1 = str1.replace(/\)/g, "%29"); //替换特殊字符。

  //sha256加密
  str2 = hex_sha256(str1).toUpperCase();
  console.log('加密后: ',str2);
  return str2;
}

/**
 * json格式转KEY=VALUE格式 键值对方法。
 * data 为json或数组格式
 */
function jsonToKV(data) {
  var array0 = array1 = array2 = [];
  var str0 = str1 = str2 = "";
  //传入数组的处理,处理完跳出函数.
  if (data instanceof Array) {
    //遍历数组, 数组不做排序
    data.forEach(function(item, index, array) {
      str2 = "";
      array2 = [];
      //数组里每项进行键值对转换, push进array2.
      for (var key1 in item) {
        if (typeof(item[key1]) != "object") {
          array2.push(key1 + "=" + item[key1]);
        }
      }
      //array2排序后, 继续键值对转换.
      array2.sort();
      for (var i = 0; i < array2.length; i++) {
        if (i == array2.length - 1) {
          str2 += array2[i];
        } else {
          str2 += array2[i] + "&";
        }
      }
      str2 = str2.replace(/'|"/ig, '');
      //数组每项替换成转换键值对后的字符串.
      data[index] = str2;
    });
    // 遍历数组,继续键值对转换.
    for (var i = 0; i < data.length; i++) {
      if (i == data.length - 1) {
        str1 += data[i];
      } else {
        str1 += data[i] + "&";
      }
    }
    str1 = str1.replace(/'|"/ig, '');
    //返回str1, 跳出函数.
    return str1;
  }

  //传入json的处理,第一步, 值为数组和json 的 复杂类型json格式. 转为普通json格式.
  for (var key in data) {
    str1 = "";
    array1 = [];
    //json值为数组的处理.
    if (data[key] instanceof Array) {
      //遍历数组, 数组不做排序.
      data[key].forEach(function(item, index, array) {
        str2 = "";
        array2 = [];
        //遍历数组里的单个json项.并进行键值对转换, push进array2.
        for (var key1 in item) {
          if (typeof(item[key1]) != "object") {
            array2.push(key1 + "=" + item[key1]);
          }
        }
        //array2内排序后, 继续键值对转换.
        array2.sort();
        for (var i = 0; i < array2.length; i++) {
          if (i == array2.length - 1) {
            str2 += array2[i];
          } else {
            str2 += array2[i] + "&";
          }
        }
        str2 = str2.replace(/'|"/ig, '');
        //把数组替换成转换键值对并排序后的字符串.
        data[key][index] = str2;
      });
      // 遍历数组,继续键值对转换.不做排序.
      for (var i = 0; i < data[key].length; i++) {
        if (i == data[key].length - 1) {
          str1 += data[key][i];
        } else {
          str1 += data[key][i] + "&";
        }
      }
      str1 = str1.replace(/'|"/ig, '');
      //值为数组的部分 替换成键值对后的字符串.转为普通json格式完成.
      data[key] = str1;

    } else if (data[key] instanceof Object) {
      //json值为json的处理.
      var data1 = data[key];

      //遍历json值里的json.并进行键值对转换, push进array1.
      for (var key1 in data1) {
        if (typeof(data1[key1]) != "object") {
          array1.push(key1 + "=" + data1[key1]);
        }
      }
      //array1内排序后, 继续键值对转换.
      array1.sort();
      for (var i = 0; i < array1.length; i++) {
        if (i == array1.length - 1) {
          str1 += array1[i];
        } else {
          str1 += array1[i] + "&";
        }
      }
      str1 = str1.replace(/'|"/ig, '');
      //值为json的部分 替换成键值对后的字符串.转为普通json格式完成.
      data[key] = str1;
    }
  }
  
  //传入json的处理,第二步, 对 普通json格式或者转换后的json格式 进行键值对转换.
  for (var key in data) {
    array0.push(key + "=" + data[key]);
  };
  array0.sort();
  for (var i = 0; i < array0.length; i++) {
    if (i == array0.length - 1) {
      str0 += array0[i];
    } else {
      str0 += array0[i] + "&";
    }
  }
  str0 = str0.replace(/'|"/ig, '');

  console.log("jsonToKV: ", str0);
  return str0;
}


// 传字符串单独计算sig
function tempSig(data) {
  console.log('原数据');
  console.log(data);
  var str = data;
  // str = jsonToKV(data);
  // 转码
  // str = jsonToKV(str);
  str = encodeURIComponent(str);
  // str = sortStr(str);
  console.log('转码后');
  console.log(str);
  str = hex_sha256(str).toUpperCase();
  console.log('加密后');
  console.log(str);
}